package top.albertiy.原型模式;

import java.io.*;

/**
 * 可以克隆的对象
 */
public class Prototype implements Cloneable, Serializable {

    private static final long serialVersionUID = 1L;
    private String string;

    private SerializableObject obj;

    /**
     * 此方法名可为任意名称，重点是调用 Object.clone() 方法
     */
    // 浅复制：将一个对象复制后，基本数据类型的变量重新创建，引用类型指向原对象所指向的
    public Object clone() throws CloneNotSupportedException {
        Prototype proto = (Prototype) super.clone();
        return proto;
    }

    // 深复制：无论基本类型还是引用类型都重新创建。
    /** 利用序列化和对象流来实现深复制 */
    public Object deepClone() throws IOException, ClassNotFoundException {
        /** 写入当前对象的二进制流 */
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);

        /** 读出二进制流产生的新对象 */
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return ois.readObject();
    }

    public String getString() {
        return string;
    }

    public void setString(String string) {
        this.string = string;
    }

    public SerializableObject getObj() {
        return obj;
    }

    public void setObj(SerializableObject obj) {
        this.obj = obj;
    }
}

class SerializableObject implements Serializable {
    private static final long serialVersionUID = 1L;
}